home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / +look_here_1st!+ / reader_requests / alienbreed3d2 / cheesesauce / loadmod.a < prev    next >
Text File  |  1997-11-28  |  6KB  |  261 lines

  1. ;    (Octa)MED module load routines, by Teijo Kinnunen
  2. ;    MED V3.00 module support added        22-Jan-1991
  3. ;    upgraded for V3.20 (OctaMED V2.00)    02-Aug-1991
  4. ;    and for OctaMED Pro V3.00        02-Apr-1992
  5. ;    (bug fix)                31-May-1992
  6. ;    OctaMED Pro V5 support (MMD2)        18-May-1993
  7. ;    OctaMED Pro V6 support (cmd pages)    16-Jan-1995
  8. ;    2 bug fixes (Thanks to Peter Kunath.)    14-Feb-1995
  9.  
  10. ;    $VER: loadmod_a 6.1 (14.02.1995)
  11.  
  12. ;    Function: d0 = _LoadModule(a0)
  13. ;    a0 = module name
  14. ;    d0 = pointer to loaded module, zero if load failed
  15.  
  16.     XDEF    _LoadModule
  17.     XDEF    _UnLoadModule
  18.     XDEF    _RelocModule
  19.  
  20. mmd_songinfo    EQU    8
  21. mmd_blockarr    EQU    16
  22. mmd_expdata    EQU    32
  23. mmd_songsleft    EQU    51
  24. msng_numblocks    EQU    504
  25. msng_pseqs    EQU    508
  26. msng_numsamples    EQU    787
  27.  
  28.     CODE
  29. _LoadModule:
  30.         movem.l a2-a4/a6/d2-d6,-(sp)
  31.     PRSDF
  32.         moveq    #0,d6        ;d6 = return value (zero = error)
  33.         move.l  a0,a4        ;a4 = module name
  34.         movea.l 4,a6
  35.         lea     dosname(pc),a1
  36.         moveq    #0,d0
  37.         jsr     -$228(a6)    ;OpenLibrary()
  38.         tst.l   d0
  39.         PRSDE
  40.         beq     xlm1
  41.         move.l  d0,a3        ;a3 = DOSBase
  42.         move.l  d0,a6
  43.         move.l  a4,d1        ;name = d1
  44.         move.l  #1005,d2    ;accessmode = MODE_OLDFILE
  45.         jsr     -$1e(a6)    ;Open()
  46.         move.l  d0,d4        ;d4 = file handle
  47.         beq     xlm2
  48.         move.l  d4,d1
  49.         moveq   #0,d2
  50.         moveq   #1,d3        ;OFFSET_END
  51.         jsr     -$42(a6)    ;Seek(fh,0,OFFSET_END)
  52.         move.l  d4,d1
  53.         moveq    #-1,d3        ;OFFSET_BEGINNING
  54.         jsr     -$42(a6)    ;Seek(fh,0,OFFSET_BEGINNING)
  55.         move.l  d0,d5        ;d5 = file size
  56.         movea.l 4,a6
  57.         moveq   #2,d1        ;get chip mem
  58.         jsr     -$c6(a6)    ;AllocMem()
  59.         tst.l   d0
  60.         beq.s   xlm3
  61.         move.l  d0,a2        ;a2 = pointer to module
  62.         move.l  d4,d1    ;file
  63.         move.l  d0,d2    ;buffer
  64.         move.l  d5,d3    ;length
  65.         move.l  a3,a6
  66.         jsr     -$2a(a6)    ;Read()
  67.         cmp.l   d5,d0
  68.         bne.s   xlm4        ;something wrong...
  69.         cmp.l    #'MMD2',(a2)    ;Pro V5 module?
  70.         beq.s    id_ok
  71.         cmp.l    #'MMD1',(a2)    ;Pro module?
  72.         beq.s    id_ok
  73.         cmp.l   #'MMD0',(a2)
  74.         bne.s   xlm4        ;this is not a module!!!
  75. id_ok        movea.l a2,a0
  76.         bsr.s   _RelocModule
  77.         move.l  a2,d6        ;no error...
  78.         bra.s   xlm3
  79. xlm4        move.l  a2,a1        ;error: free the memory
  80.         move.l  d5,d0
  81.         movea.l 4,a6
  82.         jsr     -$d2(a6)    ;FreeMem()
  83. xlm3        move.l  a3,a6        ;close the file
  84.         move.l  d4,d1
  85.         jsr     -$24(a6)    ;Close(fhandle)
  86. xlm2        move.l  a3,a1        ;close dos.library
  87.         movea.l 4,a6
  88.         jsr     -$19e(a6)
  89. xlm1        move.l  d6,d0        ;push return value
  90.         movem.l (sp)+,a2-a4/a6/d2-d6    ;restore registers
  91.         rts            ;and exit...
  92. dosname        dc.b    'dos.library',0
  93.  
  94. ;    Function: _RelocModule(a0)
  95. ;    a0 = pointer to module
  96.  
  97. ; This function is a bit strangely arranged around the small reloc-routine.
  98. reloci        move.l    24(a2),d0
  99.         beq.s    xloci
  100.         movea.l    d0,a0
  101.         moveq   #0,d0
  102.         move.b  msng_numsamples(a1),d0    ;number of samples
  103.         subq.b  #1,d0
  104. relocs        bsr.s   relocentr
  105.         move.l    -4(a0),d3    ;sample ptr
  106.         beq.s    nosyn
  107.         move.l    d3,a3
  108.         tst.w    4(a3)
  109.         bpl.s    nosyn        ;type >= 0
  110.         move.w    20(a3),d2    ;number of waveforms
  111.         lea    278(a3),a3    ;ptr to wf ptrs
  112.         subq.w    #1,d2
  113. relsyn        add.l    d3,(a3)+
  114.         dbf    d2,relsyn
  115. nosyn        dbf     d0,relocs
  116. xloci        rts
  117. norel        addq.l    #4,a0
  118.         rts
  119. relocentr    tst.l   (a0)
  120.         beq.s   norel
  121.         add.l   d1,(a0)+
  122.         rts
  123. _RelocModule:
  124.         movem.l    a2-a4/d2-d4,-(sp)
  125.         movea.l a0,a2
  126.         move.l  a2,d1        ;d1 = ptr to start of module
  127.         bsr.s    relocp
  128.         movea.l mmd_songinfo(a2),a1
  129.         bsr.s    reloci
  130.         move.b    mmd_songsleft(a2),d4
  131. rel_lp        bsr.s    relocb
  132.         cmp.b    #'2',3(a2)    ;MMD2?
  133.         bne.s    norelmmd2
  134.         bsr.w    relocmmd2sng
  135. norelmmd2    move.l    mmd_expdata(a2),d0    ;extension struct
  136.         beq.s    rel_ex
  137.         move.l    d0,a0
  138.         bsr.s    relocentr    ;ptr to next module
  139.         bsr.s    relocentr    ;InstrExt...
  140.         addq.l    #4,a0        ;skip sizes of InstrExt
  141. ; We reloc the pointers of MMD0exp, so anybody who needs them can easily
  142. ; read them.
  143.         bsr.s    relocentr    ;annotxt
  144.         addq.l    #4,a0        ;annolen
  145.         bsr.s    relocentr    ;InstrInfo
  146.         addq.l    #8,a0
  147.         bsr.s    relocentr    ;rgbtable (not useful for most people)
  148.         addq.l    #4,a0        ;skip channelsplit
  149.         bsr.s    relocentr    ;NotationInfo
  150.         bsr.s    relocentr    ;songname
  151.         addq.l    #4,a0        ;skip song name length
  152.         bsr.s    relocentr    ;MIDI dumps
  153.         bsr.s    relocmdd
  154.         subq.b    #1,d4        ;songs left..?
  155.         bcs.s    rel_ex
  156.         move.l    d0,a0
  157.         move.l    (a0),d0
  158.         beq.s    rel_ex
  159.         move.l    d0,a2
  160.         bsr.s    relocp
  161.         movea.l 8(a2),a1
  162.         bra.s    rel_lp
  163. rel_ex        movem.l    (sp)+,d2-d4/a2-a4
  164.         rts
  165.  
  166. relocp        lea    mmd_songinfo(a2),a0
  167.         bsr.s    relocentr
  168.         addq.l    #4,a0
  169.         bsr.s    relocentr
  170.         addq.l    #4,a0
  171.         bsr.s    relocentr
  172.         addq.l    #4,a0
  173.         bra.s    relocentr
  174.  
  175. relocb        move.l    mmd_blockarr(a2),d0
  176.         beq.s    xlocb
  177.         movea.l    d0,a0
  178.         move.w  msng_numblocks(a1),d0
  179.         subq.b  #1,d0
  180. rebl        bsr    relocentr
  181.         dbf     d0,rebl
  182.         cmp.b    #'T',3(a2)    ;MMD0 (= MCNT)
  183.         beq.s    xlocb
  184.         cmp.b    #'1',3(a2)    ;test MMD type
  185.         bge.s    relocbi
  186. xlocb        rts
  187.  
  188. relocmdd    move.l    d0,-(sp)
  189.         tst.l    -(a0)
  190.         beq.s    xlocmdd
  191.         movea.l    (a0),a0
  192.         move.w    (a0),d0        ;# of msg dumps
  193.         addq.l    #8,a0
  194. mddloop        beq.s    xlocmdd
  195.         bsr    relocentr
  196.         bsr.s    relocdmp
  197.         subq.w    #1,d0
  198.         bra.s    mddloop
  199. xlocmdd        move.l    (sp)+,d0
  200.         rts
  201.  
  202. relocdmp    move.l    -4(a0),d3
  203.         beq.s    xlocdmp
  204.         exg.l    a0,d3        ;save
  205.         addq.l    #4,a0
  206.         bsr    relocentr    ;reloc data pointer
  207.         move.l    d3,a0        ;restore
  208. xlocdmp        rts
  209.  
  210. relocbi        move.w    msng_numblocks(a1),d0
  211.         move.l    a0,a3
  212. biloop        subq.w    #1,d0
  213.         bmi.s    xlocdmp
  214.         move.l    -(a3),a0
  215.         addq.l    #4,a0
  216.         bsr    relocentr    ;BlockInfo ptr
  217.         tst.l    -(a0)
  218.         beq.s    biloop
  219.         move.l    (a0),a0
  220.         bsr    relocentr    ;hldata
  221.         bsr    relocentr    ;block name
  222.         addq.l    #4,a0        ;skip blocknamelen
  223.         bsr    relocentr    ;pagetable
  224.         tst.l    -(a0)
  225.         bne.s    relocpgtbl
  226.         bra.s    biloop
  227. ; take care of the new features of MMD2s
  228. relocmmd2sng    move.l    mmd_songinfo(a2),a0
  229.         lea    msng_pseqs(a0),a0
  230.         bsr    relocentr    ;playseqtable
  231.         bsr    relocentr    ;sectiontable
  232.         bsr    relocentr    ;trackvols
  233.         move.w    2(a0),d0    ;numpseqs
  234.         move.l    -12(a0),a0    ;get back to playseqtable
  235.         subq.w    #1,d0
  236. psqtblloop    bsr    relocentr
  237.         dbf    d0,psqtblloop
  238.         rts
  239. relocpgtbl    movea.l    (a0),a4        ;page table list hdr
  240.         move.w    (a4),d2
  241.         subq.w    #1,d2
  242.         lea    4(a4),a0
  243. pgtblloop    bsr    relocentr
  244.         dbf    d2,pgtblloop
  245.         bra    biloop
  246.  
  247.  
  248. ;    Function: _UnLoadModule(a0)
  249. ;    a0 = pointer to module
  250. _UnLoadModule:
  251.         move.l  a6,-(sp)
  252.         move.l  a0,d0
  253.         beq.s   xunl
  254.         movea.l 4,a6
  255.         move.l  4(a0),d0
  256.         beq.s   xunl
  257.         movea.l a0,a1
  258.         jsr     -$d2(a6)    ;FreeMem()
  259. xunl        move.l    (sp)+,a6
  260.         rts
  261.